import axios from 'axios'

// 导入vant中的组件toast
import { Toast } from 'vant'

// 导入操作token的文件
import { removeLocal, getLocal } from './local'

// 导入vuex
import store from '../store/index'

// 导入路由
import router from '../router/index'

// 创建一个axios实例
const _fetch = axios.create({
  // 设置全局的基地址
  baseURL: process.env.VUE_APP_BASEURL
})

// 添加请求拦截器
_fetch.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    // 判断该请求是否需要在请求头中携带token
    if (config.needToken) {
      // 需要，判断是否有token
      if (getLocal()) {
        // 有的话就在将token设置在请求头中携带过去
        config.headers.authorization = 'Bearer ' + getLocal()
      }
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
_fetch.interceptors.response.use(
  function (response) {
    // 进行统一的登录异常管理
    if (response.data.code === 200) {
      // 正常返回给接口调用者
      return response.data
    } else if (response.data.code === 401 || response.data.code === 403) {
      // 表明token过期或者未登录
      // 1.提示用户错误信息
      Toast.fail(response.data.message)
      // 2.删除token
      removeLocal()
      // 3.修改登录状态
      store.commit('setIsLogin', false)
      // 4.返回登陆页
      router.push('/login')
      // 5.将错误信息返回
      return Promise.reject(new Error(response.data.message))
    } else {
      // 参数错误等状态
      // 提示错误信息
      Toast.fail(response.data.message)
      // 将错误信息返回
      return Promise.reject(new Error(response.data.message))
    }
  },
  function (error) {
    // 对响应错误做点什么
    return Promise.reject(error)
  }
)

// 将创建的实例暴露出去
export default _fetch
